/**
 * @file CRhoAlgCommon.hpp Deklarácia triedy CRhoAlgCommon.
 *
 * @author Martin Kosorinský.
 * @date 1.11.2009.
 */

#ifndef CRHOALGCOMMON_HEADER
#define CRHOALGCOMMON_HEADER

#include "CECContext.hpp"

/**
 * @brief Trieda zapúzdrujúca všeobecné procedúry a funkcie Pollard-Rho algoritmov.
 * Trieda obsahuje procedúry pre výpočty diskrétneho logaritmu za pomoci parametrov kolízie,
 * ako aj skokovú funkciu, ktorá zabezpečuje deterministickú trajektóriu postupnosti bodov.
 */
class CRhoAlgCommon : public CECContext {
public:
    /**
     * @brief Vypočíta rád prvku na základe parametrov kolízie.
     * Vstupom funkcie sú exponenty vystupujúce v rovnici nájdenej kolízie. Výstupom funkcie je
     * celé číslo @a vysledok, ktoré je vypočítané na základe modulárnej rovnice: (@a aj - @a ak)* @a vysledok = @a bk - @a bj (mod ord).
     * V prípade, že rovnica nemá riešenie, funkcia je prerušená s návratovou hodnotou FALSE a parameter
     * @a vysledok nie je modifikovaný.
     * @param[in] aj je vstupný parameter.
     * @param[in] bj je vstupný parameter.
     * @param[in] ak je vstupný parameter.
     * @param[in] bk je vstupný parameter.
     * @param[out] vysledok je výstupný parameter. Výstupom je výsledok modulárnej operácie (@a bk- @a bj)/(@a aj- @a ak) (mod ord).
     * V prípade neúspešného výpočtu má vysledok nezmenenú hodnotu.
     * @return Vráti TRUE ak bol výpočet úspešný. V opačnom prípade vráti FALSE (zlyhanie podmienky s gcd).
     */
    static bool computeIndex(const big aj, const big bj, const big ak, const big bk, big vysledok);
    /**
     * @brief Funkcia overujúca správnosť nájdeného diskrétneho logaritmu.
     * Funkcia overí, či parameter @a dl obsahuje správny diskrétny logaritmus bodu #H vzhľadom na
     * generátor #G. Z toho vyplýva nutnosť inicializácie týchto bodov pred volaním funkcie.
     * @param[in] dl Diskrétny logaritmus, ktorého správnosť chceme overiť.
     * @return Vráti TRUE, ak @a dl je správny (hľadaný) diskrétny logaritmus.
     */
    static bool checkIndex(big dl);
protected:
    /**
     * @brief Pomocná procedúra, vykonávajúca skok medzi bodmi grupy.
     * Procedúra vykoná skok (grupovú operáciu na bode) na základe vstupných parametrov. Je navrhnutá
     * podľa požiadaviek Pollard-Rho algoritmu. Spolu so vstupným bodom sú modifikované aj zvyšné vstupné
     * parametre - exponenty, tak aby zmena exponentov súhlasila so zmenou bodu.
     * @param[in,out] X  je bod na eliptickej krivke typu epoint*, na ktorom vykonáme grupovú operáciu.
     * @param[in,out] a predstavuje exponent pri bode G (generátor)
     * @param[in,out] b predstavuje exponent pri bode H (bod s neznámym DL).
     * @param[out] tmp Pomocná vopred alokovaná štruktúra (kvôli eliminácii operáciám s pamäťou pri každom volaní).
     */
    static void makeStep(epoint * X, big a, big b, big tmp);
};

#endif /* CRHOALGCOMMON_HEADER */

